home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / lib / util / gcread.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-11  |  2.7 KB  |  73 lines

  1. #include "util.h"
  2.  
  3. /* Modified gcread to use stdio. Jim Lieb SRI International Aug 1980 */
  4. /*   returns -1 for error, 0 for eof, positive with count for success */
  5. /*   Successive calls will return error or eof after first encounter  */
  6. /*   Neither eof nor error will be indicated until buffer is emptied  */
  7. /* Modified by Phil Cockcroft UCL Mar 85 to handle quoted strings properly */
  8.  
  9. gcread (fp, obuf, len, endchrs)
  10. FILE  *fp;
  11. int       len;                  /* maximum allowed to xfer              */
  12. char   *obuf,                   /* destination buffer                   */
  13.        *endchrs;                /* list of chars to terminate on        */
  14.                                 /*   "abcdef\377"                       */
  15. {
  16.     return (qread (fp, obuf, len, endchrs, 0));
  17. }
  18.  
  19. qread (fp, obuf, len, endchrs, quotechar)
  20. FILE  *fp;
  21. int       len;                  /* maximum allowed to xfer              */
  22. char   *obuf,                   /* destination buffer                   */
  23.        *endchrs;                /* list of chars to terminate on        */
  24.                                 /*   "abcdef\377"                       */
  25. char    quotechar;              /* a single character quote             */
  26. {
  27.     char *bptr;
  28.     register int c;
  29.     register short cnt;
  30.     register char *end;
  31.  
  32.     if (feof (fp))
  33.       return (OK);
  34.  
  35.     if (ferror (fp))
  36.       return (NOTOK);
  37.  
  38.     for (bptr = obuf, cnt = 0; cnt < len; cnt++)
  39.     {
  40.         if ((c = getc(fp)) == EOF)      /* maybe end-of-file            */
  41.         {
  42.             if (ferror (fp))
  43.                 return ((cnt == 0) ? NOTOK : cnt);
  44.             if (feof (fp))
  45.                 return (cnt);
  46.         }
  47.         if(quotechar != '\0' && c == quotechar)
  48.         {
  49.             if ((c = getc(fp)) == EOF)      /* maybe end-of-file        */
  50.             {
  51.                 if (bptr != 0)              /* what do we do here ????  */
  52.                     *bptr = quotechar;
  53.                 if (ferror (fp))
  54.                     return ((cnt == 0) ? NOTOK : cnt);
  55.                 if (feof (fp))
  56.                     return (cnt);
  57.                 /* EH ? I hope we will never get here */
  58.             }
  59.             if (bptr != 0)              /*  0 => just skip the text     */
  60.                 *bptr++ = c;            /*  xfer one char               */
  61.             continue;
  62.         }
  63.         if (bptr != 0)                  /*  0 => just skip the text     */
  64.             *bptr++ = c;                /*  xfer one char               */
  65.  
  66.         if (end = endchrs)              /*  check if it's in breakset   */
  67.         while ((*end & 0377) != (0377))   /*  Grrrrrr.... */
  68.                 if (c == *end++)
  69.                     return ++cnt;
  70.     }
  71.     return (cnt);                        /* return num xferred           */
  72. }
  73.